package com.zlb.app.common.handler;

import cn.dev33.satoken.exception.NotLoginException;
import com.zlb.app.common.constant.Constants;
import com.zlb.app.common.entity.R;
import com.zlb.app.common.exception.BusinessException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @Description 全局异常处理
 * @Author zWX1367238
 * @Since 2024-08-14 15:21:15
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    // 全局异常拦截（拦截项目中的NotLoginException异常）
    @ExceptionHandler(NotLoginException.class)
    public R<?> handlerNotLoginException(NotLoginException nle)
        throws Exception {

        // 打印堆栈，以供调试
        nle.printStackTrace();

        // 判断场景值，定制化异常信息
        String message = "";
        if(nle.getType().equals(NotLoginException.NOT_TOKEN)) {
            // message = "未能读取到有效 token";
            message = "您还未登录,请先登录!";
        }
        else if(nle.getType().equals(NotLoginException.INVALID_TOKEN)) {
            message = "token 无效";
            message = "登录信息无效!";
        }
        else if(nle.getType().equals(NotLoginException.TOKEN_TIMEOUT)) {
            message = "token 已过期";
            message = "登录已过期,请重新登录!";
        }
        else if(nle.getType().equals(NotLoginException.BE_REPLACED)) {
            message = "token 已被顶下线";
            message = "已在别处登录,如果不是您在操作,请修改密码!";
        }
        else if(nle.getType().equals(NotLoginException.KICK_OUT)) {
            message = "token 已被踢下线";
            message = "您已被踢下线";
        }
        else if(nle.getType().equals(NotLoginException.TOKEN_FREEZE)) {
            message = "token 已被冻结";
            message = "您的账号已被冻结!";
        }
        else if(nle.getType().equals(NotLoginException.NO_PREFIX)) {
            message = "未按照指定前缀提交 token";
            message = "Token格式错误!";
        }
        else {
            message = "您还未登录,请先登录!";
        }

        // 返回给前端
        return R.fail(message);
    }

    @ExceptionHandler(value = BusinessException.class)
    public R<?> errorHandler(BusinessException e) {
        return R.fail(e.getCode(), e.getMessage());
    }

    @ExceptionHandler(value = Exception.class)
    public R<?> errorHandler(Exception e) {
        e.printStackTrace();
        return R.fail(Constants.DEFAULT_ERROR_CODE, Constants.DEFAULT_ERROR_MSG);
    }

}
